from flask_wtf import FlaskForm 
from wtforms import StringField,PasswordField,BooleanField,SubmitField
from wtforms.validators import Required,Length,Email,Regexp,EqualTo
from wtforms import ValidationError
from ..models import User

class LoginForm(FlaskForm):
	email=StringField('Email',validators=[Required(),Length(1,64),Email()])
	password=PasswordField('Password',validators=[Required()])
	remember_me=BooleanField('Keep me logged in')
	submit=SubmitField('Log In')
	

#用户注册表单
class RegistrationForm(FlaskForm):
    email=StringField('Email',validators=[Required(),Length(1,64),Email()])
    username=StringField('Username',validators=[Required(),Length(1,64),Regexp('^[A-Za-z0-9_.]*$',0,
						'Usernames must have only letters,numbers,dots or underscores')])
    password=PasswordField('Password',validators=[Required(),EqualTo('password2',message='Passwords must match.')])
    password2=PasswordField('Confirm password',validators=[Required()])
    submit=SubmitField('Register')

    #确保写入的email和username在数据库中没有出现过 
    def validate_email(self,field):
        if User.query.filter_by(email=field.data).first(): 
            raise ValidationError('Email already registered.')

    def validate_username(self, field):
        if User.query.filter_by(username=field.data).first():
            raise ValidationError('Username already in use.')

#修改密码表单
class ChangePasswordForm(FlaskForm):
    old_password=PasswordField('Old Password',validators=[Required()])
    password=PasswordField('New password',validators=[
        Required(),EqualTo('password2',message='Passwords must match.')])
    password2=PasswordField('Confirm new password',validators=[Required()])
    submit=SubmitField('Update Password')

#发送重置密码邮件表单
class PasswordResetForm(FlaskForm):
    email=StringField('Email',validators=[Required(),Length(1,64),Email()])
    submit=SubmitField('发送邮件')

#重置密码表单
class ResetForm(FlaskForm):
    email=StringField('Email',validators=[Required(),Length(1,64),Email()])
    password=PasswordField('New password',validators=[
        Required(),EqualTo('password2',message='Passwords must match.')])
    password2=PasswordField('Confirm new password',validators=[Required()])
    submit=SubmitField('Update Password')


